package br.leiam.eolica.denis;
//Um Table Model que fornece dados ResultSet a um JTable

import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.swing.table.AbstractTableModel;
import org.jfree.data.jdbc.JDBCCategoryDataset;
import org.jfree.data.jdbc.JDBCXYDataset;
// Linhas e colunas do ResultSet sÃ£o contadas a partir de 1 e linhas e
// colunas JTable sÃ£o contadas a partir de 0. Ao processar
// linhas ou colunas de ResultSet para utilizaÃ§Ã£o em uma JTable, Ã©
// necessÃ¡rio adicionar 1 ao nÃºmero de linha ou coluna para manipular
// a coluna apropriada de ResultSet (isto Ã©, coluna 0 de JTable Ã© a
// coluna de ResultSet 1 e a linha de JTable 0 Ã© a linha de ResultSet 1).
public class ResultSetTableModel1 extends AbstractTableModel
{
   private Connection connection;
   private Statement statement;
   private ResultSet resultSet;
   private ResultSetMetaData metaData;
   //private JDBCCategoryDataset chartDataset; //UTILIZADO NO CHART EM DisplayQueryResults
   private JDBCXYDataset chartDataset;
   private int numberOfRows;

   // monitora o status da conexÃ£o de banco de dados
   private boolean connectedToDatabase = false;

   public JDBCXYDataset getChartDataset(){
       return chartDataset;
   }
   // construtor inicializa resultSet e obtÃ©m seu objeto de metadados;
   // determina nÃºmero de linhas
   public ResultSetTableModel1( String driver, String url,
      String username, String password, String query )
      throws SQLException, ClassNotFoundException
   {
      // carrega classe de driver do banco de dados
      Class.forName( driver );

      // conecta-se ao banco de dados
      connection = DriverManager.getConnection( url, username, password );

      // cria Statement para consultar banco de dados
      statement = connection.createStatement(
         ResultSet.TYPE_SCROLL_INSENSITIVE,
         ResultSet.CONCUR_READ_ONLY );

      // atualiza status de conexÃ£o de banco de dados
      connectedToDatabase = true;

      chartDataset = new JDBCXYDataset(connection, query);

      // configura consulta e a executa
      setQuery( query );
   } // fim do construtor ResultSetTableModel

   // obtÃ©m a classe que representa o tipo de coluna
   public Class getColumnClass( int column )throws IllegalStateException
   {
      // assegura que o banco de dados conexÃ£o estÃ¡ disponÃ­vel
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // determina a classe Java de coluna
      try
      {
         String className = metaData.getColumnClassName( column + 1 );

         // retorna objeto Class que representa className
         return Class.forName( className );
      } // fim do try
      catch ( Exception exception )
      {
         exception.printStackTrace();
      } // fim do catch

      return Object.class; // se ocorrerem os problemas acima, assume tipo Object
   } // fim do mÃ©todo getColumnClass

   // obtÃ©m nÃºmero de colunas em ResultSet
   public int getColumnCount()throws IllegalStateException
   {
      // assegura que o banco de dados conexÃ£o estÃ¡ disponÃ­vel
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // determina nÃºmero de colunas
      try
      {
         return metaData.getColumnCount();
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch

      return 0; // se ocorrerem os problemas acima, retorna 0 para o nÃºmero de colunas
   } // fim do mÃ©todo getColumnCount

   // obtÃ©m nome de uma coluna particular em ResultSet
   public String getColumnName( int column )throws IllegalStateException
   {
      // assegura que o banco de dados conexÃ£o estÃ¡ disponÃ­vel
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // determina o nome de coluna
      try
      {
         return metaData.getColumnName( column + 1 );
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch

      return ""; // se ocorrerem problemas, retorna string vazia para nome de coluna
   } // fim do mÃ©todo getColumnName

   // retorna nÃºmero de linhas em ResultSet
   public int getRowCount()throws IllegalStateException
   {
      // assegura que o banco de dados conexÃ£o estÃ¡ disponÃ­vel
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      return numberOfRows;
   } // fim do mÃ©todo getRowCount

   // obtÃ©m valor na linha e coluna particular
   public Object getValueAt( int row, int column )
      throws IllegalStateException
   {
      // assegura que o banco de dados conexÃ£o estÃ¡ disponÃ­vel
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // obtÃ©m um valor na linha e coluna de ResultSet especificada
      try
      {
         resultSet.absolute( row + 1 );
         return resultSet.getObject( column + 1 );
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch

      return ""; // se ocorrerem problemas, retorna objeto string vazio
   } // fim do mÃ©todo getValueAt

   // configura nova string de consulta de banco de dados
   public void setQuery( String query )
      throws SQLException, IllegalStateException
   {
      // assegura que o banco de dados conexÃ£o estÃ¡ disponÃ­vel
      if ( !connectedToDatabase )
         throw new IllegalStateException( "Not Connected to Database" );

      // chartDataset = new JDBCCategoryDataset(connection, query);

      // especifica consulta e a executa
      resultSet = statement.executeQuery( query );

     // chartDataset.executeQuery( query);

      // obtÃ©m metadados para ResultSet
      metaData = resultSet.getMetaData();

      // determina o nÃºmero de linhas em ResultSet
      resultSet.last();                   // move para a Ãºltima linha
      numberOfRows = resultSet.getRow();  // obtÃ©m nÃºmero de linha
     // chartDataset.executeQuery(query);
      // notifica a JTable de que modelo foi alterado
      fireTableStructureChanged();
   } // fim do mÃ©todo setQuery

   // fecha Statement e Connection
   public void disconnectFromDatabase()
   {
      if ( !connectedToDatabase )
         return;

      // fecha Statement e Connection
      try
      {
         statement.close();
         connection.close();
      } // fim do try
      catch ( SQLException sqlException )
      {
         sqlException.printStackTrace();
      } // fim do catch
      finally  // atualiza status de conexÃ£o de banco de dados
      {
         connectedToDatabase = false;
      } // fim do finally
   } // fim do mÃ©todo disconnectFromDatabase
}  // fim da classe ResultSetTableModel


/**************************************************************************
 * (C) Copyright 1992-2005 by Deitel & Associates, Inc. and               *
 * Pearson Education, Inc. All Rights Reserved.                           *
 *                                                                        *
 * DISCLAIMER: The authors and publisher of this book have used their     *
 * best efforts in preparing the book. These efforts include the          *
 * development, research, and testing of the theories and programs        *
 * to determine their effectiveness. The authors and publisher make       *
 * no warranty of any kind, expressed or implied, with regard to these    *
 * programs or to the documentation contained in these books. The authors *
 * and publisher shall not be liable in any event for incidental or       *
 * consequential damages in connection with, or arising out of, the       *
 * furnishing, performance, or use of these programs.                     *
 *************************************************************************/